/*
 * @(#)UserController.java v2.0 2016年11月22日
 * 百联集团	版权所有
 * 
 * 文件描述...
 *
 * @Title: UserController.java 
 * @Package com.bailiangroup.gsp.oms.controller 
 * @author tylong
 * @date 2016年11月22日 下午11:35:41
 * @version v2.0
 * 历史版本：
 * 	1. 【2016年11月22日】 创建文件   by tylong
 */
package com.ess.web.controller.user;

import com.bailian.pagehelper.PageInfo;
import com.blgroup.b2b.common.constant.SysMessage;
import com.blgroup.b2b.common.entity.MessageResultInfo;
import com.blgroup.b2b.common.model.Role;
import com.blgroup.b2b.common.model.User;
import com.blgroup.b2b.common.model.UserRole;
import com.blgroup.b2b.common.redis.RedisClientTemplate;
import com.blgroup.b2b.web.dto.*;
import com.blgroup.b2b.web.service.sys.RoleService;
import com.blgroup.b2b.web.service.sys.UserRoleService;
import com.blgroup.b2b.web.service.sys.UserService;
import com.blgroup.b2b.web.util.BeanUtils;
import com.blgroup.b2b.web.util.EncryptUtils;
import com.blgroup.b2b.web.util.QueryLikeUtils;
import com.ess.web.controller.base.BaseController;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.Date;
import java.util.List;

/** 
 * 用户Controller
 * 
 * @ClassName: UserController 
 * @author tylong
 * @date 2016年11月22日 下午11:35:41
 * @version v2.0 
 *  
 */
@RestController
@RequestMapping(value = "/sys")
public class UserController extends BaseController {
	
	
	@Autowired
	RedisClientTemplate redisClientTemplate;

	/**
	 * 日志变量
	 */
	static final Logger logger = LoggerFactory.getLogger(UserController.class);
	/**
	 * 用户service
	 */
	@Autowired
	UserService userService;
	
	@Autowired
	RoleService roleService;
	
	@Autowired
	UserRoleService userRoleService;
	/**
	 * 
	 * 方法描述：   删除用户
	 * 业务逻辑说明  ：删除用户 
	 * 1、根据唯一主键删除<br/>
	 * @Title: deleteUser 
	 * @date 2016年11月22日 下午8:31:28
	 * @author tylong
	 * @modifier 
	 * @modifydate 
	 * @param request
	 * @param response
	 * @param dto
	 * @return
	 */
	@RequiresPermissions("user:updateUser")
	@RequestMapping(value = "/deleteUser", method = RequestMethod.POST)
	@ResponseBody
	public Object deleteUser(@RequestParam String sid, @RequestParam String updateUser, HttpServletRequest request, HttpServletResponse response) {
		MessageResultInfo resultInfo=new MessageResultInfo();
		try {
			DeleteUserReqDto dto = new DeleteUserReqDto();
			dto.setSid(sid);
			dto.setUpdateUser(updateUser);
			//删除用户
			resultInfo=userService.deleteUser(dto);
		} catch (Exception e) {
			logger.error("删除用户失败", e);
			resultInfo.setResultCode(SysMessage.SYSTEM_FAILURE_CODE);
			resultInfo.setResultMsg("删除用户失败");
		}
		return resultInfo;
	}
	/**
	 * 
	 * 方法描述：   添加用户
	 * 业务逻辑说明  ：添加用户 
	 * 1、参数校验<br/>
	 * @Title: addUser 
	 * @date 2016年11月22日 下午8:32:18
	 * @author tylong
	 * @modifier 
	 * @modifydate 
	 * @param request
	 * @param response
	 * @param dto
	 * @return
	 */
	@RequiresPermissions("user:addUser")
	@RequestMapping(value = "/addUser", method = RequestMethod.POST)
	public Object addUser(HttpServletRequest request, HttpServletResponse response, @Valid @ModelAttribute("dto") AddUserReqDto dto) {
		MessageResultInfo resultInfo=new MessageResultInfo();
		try {
			resultInfo=userService.addUser(dto);
		} catch (Exception e) {
			logger.error("新增用户失败", e);
			resultInfo.setResultCode(SysMessage.SYSTEM_FAILURE_CODE);
			resultInfo.setResultMsg("新增用户失败");
		}
		return resultInfo;
	}
	
	/**
	 * 
	 * 方法描述：   更新用户
	 * 业务逻辑说明  ：更新用户
	 * 1、参数校验<br/>
	 * 2、字典值不可更改<br/>
	 * @Title: updateUser 
	 * @date 2016年11月22日 下午8:33:19
	 * @author tylong
	 * @modifier 
	 * @modifydate 
	 * @param request
	 * @param response
	 * @param dto
	 * @return
	 */
	@RequiresPermissions("user:updateUser")
	@RequestMapping(value = "/updateUser", method = RequestMethod.POST)
	public Object updateUser(@Valid @ModelAttribute("dto") UpdateUserReqDto dto, HttpServletRequest request, HttpServletResponse response) {
		MessageResultInfo resultInfo=new MessageResultInfo();
		try {
			resultInfo=userService.updateUser(dto);
		} catch (Exception e) {
			logger.error("更新用户失败", e);
			resultInfo.setResultCode(SysMessage.SYSTEM_FAILURE_CODE);
			resultInfo.setResultMsg("更新用户失败");
		}
		return resultInfo;
	}
	
	/**
	 * 
	 * 方法描述：   更新用户
	 * 业务逻辑说明  ：更新用户
	 * 1、参数校验<br/>
	 * 2、字典值不可更改<br/>
	 * @Title: updateUser 
	 * @date 2016年11月22日 下午8:33:19
	 * @author tylong
	 * @modifier 
	 * @modifydate 
	 * @param request
	 * @param response
	 * @param dto
	 * @return
	 */
	@RequiresPermissions("user:updateUser")
	@RequestMapping(value = "/updatePas", method = RequestMethod.POST)
	public Object updatePas(@RequestParam String yPass, @RequestParam String userPass, HttpServletRequest request, HttpServletResponse response) {
		MessageResultInfo resultInfo=new MessageResultInfo();
		try {
			UpdateUserReqDto dto = new UpdateUserReqDto();
			yPass= EncryptUtils.MD5Encrypt(yPass);
			//获取当前登录用户
			User currentUser = getCurrentUser();
			QueryUserReqDto dto1=new QueryUserReqDto();
			dto1.setSid(currentUser.getSid());
			BeanUtils.convertEmptyStringToNull(dto1);
			//查询用户密码
			PageInfo<User> pageInfo=userService.queryUser(dto1);
			if(yPass.equals(pageInfo.getList().get(0).getUserPass())){
				dto.setSid(currentUser.getSid());
				dto.setUpdateDate(new Date());
				dto.setUserPass(userPass);
				resultInfo=userService.updateUser(dto);
			} else {
				logger.info("原始密码错误!");
				resultInfo.setResultCode(SysMessage.SYSTEM_PARAMETER_ERROR);
				resultInfo.setResultMsg("原始密码错误!");
				return resultInfo;
			}
		} catch (Exception e) {
			logger.error("更新用户失败", e);
			resultInfo.setResultCode(SysMessage.SYSTEM_FAILURE_CODE);
			resultInfo.setResultMsg("更新用户失败");
		}
		return resultInfo;
	}
	
	/**
	 * 
	 * 方法描述：   重置密码
	 * 业务逻辑说明  ：重置密码
	 * 1、参数校验<br/>
	 * 2、字典值不可更改<br/>
	 * @Title: updatePassword 
	 * @date 2016年11月22日 下午8:33:19
	 * @author tylong
	 * @modifier 
	 * @modifydate 
	 * @param request
	 * @param response
	 * @param dto
	 * @return
	 */
	@RequiresPermissions("user:updateUser")
	@RequestMapping(value = "/updatePassword", method = RequestMethod.POST)
	public Object updatePassword(@RequestParam String userPass, HttpServletRequest request, HttpServletResponse response) {
		MessageResultInfo resultInfo=new MessageResultInfo();
		try {
			UpdateUserReqDto dto = new UpdateUserReqDto();
			//获取当前登录用户
			User currentUser = getCurrentUser();
			dto.setSid(currentUser.getSid());
			dto.setUpdateDate(new Date());
			dto.setUserPass(userPass);
			BeanUtils.convertEmptyStringToNull(dto);
			resultInfo=userService.updateUser(dto);
		} catch (Exception e) {
			logger.error("更新用户失败", e);
			resultInfo.setResultCode(SysMessage.SYSTEM_FAILURE_CODE);
			resultInfo.setResultMsg("更新用户失败");
		}
		return resultInfo;
	}

	/**
	 * 
	 * 方法描述：   查询用户列表
	 * 业务逻辑说明  ：查询用户列表 
	 * @Title: queryUser 
	 * @date 2016年12月2日 下午6:04:48
	 * @author tylong
	 * @modifier 
	 * @modifydate 
	 * @param model
	 * @param dto
	 * @param result
	 * @param request
	 * @return
	 */
	@RequiresPermissions("user:queryUser")
	@RequestMapping(value="/queryUser",method=RequestMethod.GET)
	public ModelAndView queryUser(@Valid @ModelAttribute("dto") QueryUserReqDto dto, BindingResult bindingResult, Model model, HttpServletRequest request) {
		//查询用户列表
		ModelAndView  mv=new ModelAndView("sys/userList") ;
		try {
			if(StringUtils.isEmpty(dto.getOrderBy())){
				dto.setOrderBy("UPDATE_DATE desc");
			}
			BeanUtils.convertEmptyStringToNull(dto);
			//模糊查询 用户名和昵称
			if(null != dto.getUserName()){
				dto.setUserName(QueryLikeUtils.beforeQuery(dto.getUserName()));
			}
			if(null != dto.getUserNickname()){
				dto.setUserNickname(QueryLikeUtils.beforeQuery(dto.getUserNickname()));
			}
			PageInfo<User> pageInfo=userService.queryUser(dto);
			//convertUserIdToUserName(pageInfo.getList());
			model.addAttribute(pageInfo);
			model.addAttribute("tabId", "queryUser");
			//模糊查询 用户名和昵称回显
			if(null != dto.getUserName()){
				dto.setUserName(QueryLikeUtils.afterQuery(dto.getUserName()));
			}
			if(null != dto.getUserNickname()){
				dto.setUserNickname(QueryLikeUtils.afterQuery(dto.getUserNickname()));
			}
		} catch (Exception e) {
			logger.error(e.getMessage());
		}
		return mv;
	}
	/**
	 * 
	 * 方法描述：   查询用户信息
	 * 业务逻辑说明  ：查询用户信息 
	 * @Title: queryUserById 
	 * @date 2016年12月2日 下午6:04:48
	 * @author tylong
	 * @modifier 
	 * @modifydate 
	 * @param model
	 * @param dto
	 * @param result
	 * @param request
	 * @return
	 */
	@RequiresPermissions("user:queryUserById")
	@RequestMapping(value="/queryUserById",method=RequestMethod.GET)
	public ModelAndView queryUserById(@RequestParam String userSid, HttpServletRequest request) {
		//查询用户列表
		ModelAndView  mv=new ModelAndView("sys/userDetail") ;
		try {
			QueryUserReqDto dto=new QueryUserReqDto();
			dto.setSid(userSid);
			BeanUtils.convertEmptyStringToNull(dto);
			PageInfo<User> pageInfo=userService.queryUser(dto);
			if(null!=pageInfo&&null!=pageInfo.getList()){
				mv.addObject(pageInfo.getList().get(0));
				mv.addObject("tabId", "queryUserById");
			}
		} catch (Exception e) {
			logger.error(e.getMessage());
		}
		return mv;
	}
	
	/**
	 * 
	 * 方法描述：   方法总结
	 * 业务逻辑说明  ：TODO(总结性的归纳方法业务逻辑) 
	 * 1、处理……跳转新增用户页面……<br/>
	 * @Title: toAddUser 
	 * @date 2016年12月12日 下午5:29:26
	 * @author Limaoming
	 */
	@RequiresPermissions("user:addUser")
	@RequestMapping(value="/toAddUser",method=RequestMethod.GET)
	public ModelAndView toAddUser(HttpServletRequest request) {
		//跳转新增页面
		ModelAndView  mv=new ModelAndView("sys/userAdd");
		mv.addObject("tabId", "addUser");
		return mv;
	}
	
	@RequiresPermissions("user:updateUser")
	@RequestMapping(value="/toUpdateUser",method=RequestMethod.GET)
	public ModelAndView toUpdateUser(@ModelAttribute("dto") QueryUserReqDto dto,HttpServletRequest request) {
		//跳转修改页面
		ModelAndView  mv=new ModelAndView("sys/userUpdate");

		try {
			BeanUtils.convertEmptyStringToNull(dto);
			PageInfo<User> pageInfo=userService.queryUser(dto);
			mv.addObject("dto",pageInfo.getList().get(0));
		} catch (Exception e) {
			logger.error(e.getMessage());
		}
		mv.addObject("tabId", "updateUser");
		return mv;
	}
	
	@RequestMapping(value="/toUpdatePassword")
	public ModelAndView toUpdatePassword(HttpServletRequest request) {
		//跳转修改密码页面
		ModelAndView  mv=new ModelAndView("sys/passwordUpdate");
		mv.addObject("tabId", "toUpdatePassword");
		return mv;
	}
	
	@RequiresPermissions("user:updateStatusUser")
	@RequestMapping(value = "/updateStatusUser", method = RequestMethod.POST)
	public Object updateStatusUser(@RequestParam String sid, @RequestParam String status, @RequestParam String updateUser, HttpServletRequest request, HttpServletResponse response) {
		MessageResultInfo resultInfo=new MessageResultInfo();
		try {
			UpdateUserReqDto dto = new UpdateUserReqDto();
			dto.setSid(sid);
			dto.setStatus(status);
			dto.setUpdateUser(updateUser);
			//修改角色状态
			BeanUtils.convertEmptyStringToNull(dto);
			resultInfo=userService.updateStatusUser(dto);
		} catch (Exception e) {
			logger.error("更新用户状态失败", e);
			resultInfo.setResultCode(SysMessage.SYSTEM_FAILURE_CODE);
			resultInfo.setResultMsg("更新用户状态失败");
		}
		return resultInfo;
	}
	
	@RequiresPermissions("user:bindRole")
	@RequestMapping(value="/toBindRole",method=RequestMethod.GET)
	public ModelAndView toBindRole(@ModelAttribute("dto") QueryUserReqDto dto,HttpServletRequest request) {
		//跳转绑定页面
		ModelAndView  mv=new ModelAndView("sys/userBindRole");
		List<Role> roleList=null;
		List<UserRole> userRoleList = null;
		String roleTable = null;
		String userSid = dto.getSid();
		if(StringUtils.isNoneEmpty(userSid)){
			QueryRoleReqDto record = new QueryRoleReqDto();
			record.setIsPage("0");
			PageInfo<Role> pageRole=null;
			
			QueryUserRoleReqDto urDto = new QueryUserRoleReqDto();
			urDto.setUserSid(userSid);
			urDto.setIsPage("0");
			PageInfo<UserRole> pageUserRole = null;
			
			try {
				pageRole = roleService.queryRole(record);
				pageUserRole = userRoleService.queryUserRole(urDto);
				if(pageRole.getList() != null && pageUserRole.getList() != null){
					roleList = pageRole.getList();
					userRoleList = pageUserRole.getList();
					roleTable = userRole(roleList,userRoleList);
				}
				
				QueryUserReqDto queryDto=new QueryUserReqDto();
				queryDto.setSid(userSid);
				BeanUtils.convertEmptyStringToNull(queryDto);
				PageInfo<User> pageInfo=userService.queryUser(queryDto);
				if(null!=pageInfo&&null!=pageInfo.getList()){
					mv.addObject(pageInfo.getList().get(0));
					mv.addObject("tabId", "queryUserById");
				}
				
			} catch (Exception e) {
				logger.error(e.getMessage());
			}
		}
		mv.addObject("roleTable", roleTable);
		mv.addObject("tabId", "bindRole");
		mv.addObject("roleList", roleList);
		mv.addObject("updateOrBind", "bind");
		return mv;
	}
	
	public String userRole(List<Role> roleList, List<UserRole> userRoleList) {

		StringBuffer sb = new StringBuffer();
		if (roleList != null) {
			sb.append("<table><tbody>");
			for(Role dc : roleList) {
				String strSid = dc.getSid();
				String tdUserId = "tdUserId" + dc.getSid();
				String strName = dc.getRoleName();
				Boolean b = false;
				for (UserRole ur : userRoleList) {
					if (strSid.equals(ur.getRoleSid())) {
						b = true;
					} 
				}
				if (b) {
					sb.append("<tr><td><input type='checkbox' value='" + strSid + "' checked='true' id='"
							+ tdUserId + "' />&nbsp;<label for='" + tdUserId + "'>" + strName
							+ "</label></td></tr>");
				} else {
					sb.append("<tr><td><input type='checkbox' value='" + strSid + "' id='" + tdUserId
							+ "' />&nbsp;<label for='" + tdUserId + "'>" + strName + "</label></td></tr>");
				}

			}
			sb.append("</tbody></table>");

		}
        return sb.toString();
    }
	
}
